@CLASS
conceptModuleTests

@USE
pf/tests/pfTestCase.p

@BASE
pfTestCase

@OPTIONS
locals

@create[aTestName]
  ^BASE:create[$aTestName]

@setUp[]
  ^initModule[]

@initModule[]
  ^use[concept/conceptModule.p]
  $self.concept[^conceptModule::create[]]

@GET_CONCEPT[]
  $result[$self.concept]

@GET_STORAGE[]
  $result[$CONCEPT.STORAGE]

@basicTests[]
  ^pfAssert:isFalse(^CONCEPT.isReady[])[Ready значение не верное.]

@defaultStorageBasicTests[]
  ^pfAssert:isTrue($STORAGE is conceptStorageSQL)[Не верный объект storage по умолчанию.]

  ^pfAssert:isFalse(def $STORAGE.tablesPrefix)[Не верный префикс таблиц по умолчанию.]

  $hTables[$STORAGE.tables]
  ^pfAssert:isTrue($hTables.Locales eq "locales")[Таблица Locales не верна.]
  ^pfAssert:isTrue($hTables.Objects eq "objects")[Таблица Objects не верна.]
  ^pfAssert:isTrue($hTables.ObjectsTypes eq "objects_types")[Таблица ObjectsTypes не верна.]
  ^pfAssert:isTrue($hTables.ObjectsTexts eq "objects_texts")[Таблица ObjectsTexts не верна.]
  ^pfAssert:isTrue($hTables.DataTypes eq "data_types")[Таблица DataTypes не верна.]
  ^pfAssert:isTrue($hTables.Blocks eq "blocks")[Таблица Blocks не верна.]
  ^pfAssert:isTrue($hTables.Blocks_to_Objects eq "blocks_to_objects")[Таблица Blocks_to_Objects не верна.]
  ^pfAssert:isTrue($hTables.Processes eq "processes")[Таблица Processes не верна.]
  ^pfAssert:isTrue($hTables.ProcessesTypes eq "processes_types")[Таблица ProcessesTypes не верна.]

  $tFields[$STORAGE.additionalObjectsFields]
  ^pfAssert:isTrue($tFields is table)[Дополнительные поля Objects не являются объектом table.]
  ^pfAssert:isFalse($tFields)[Таблица доп. полей Objects не пуста.]

  $hColumns[
    $.1[select]
    $.2[update]
    $.3[field]
  ]
  $tColumns[^tFields.columns[name]]

  ^tColumns.menu{
    $sName[$hColumns.[^tColumns.line[]]]
    ^pfAssert:isTrue($tColumns.name eq $sName)[^tColumns.line[]-ый $tColumns.name столбец таблицы Object не соответствует ${sName}.]
  }

#TODO добавить проверку таблицы доп. полей текстов объекта

  ^pfAssert:isTrue(^STORAGE.isReleased[])[Значение isReleased по умолчанию не верно.]

  ^STORAGE.setRelease(false) ^pfAssert:isFalse(^STORAGE.isReleased[])[Установка isReleased не выполнена.]
  ^STORAGE.setRelease(true) ^pfAssert:isTrue(^STORAGE.isReleased[])[Повторная смена isReleased не проходит.]

@defaultStorageLocalesTests[]
  $oLocales[^STORAGE.getLocales[]]

  ^pfAssert:isTrue($oLocales is pfList)[Результат не является наследником pfList.]

  $hDefLocales[
    $.1[
      $.Language[en_US]
      $.Abbr[en]
      $.Charset[UTF-8]
    ]
    $.2[
      $.Language[ru_RU]
      $.Abbr[ru]
      $.Charset[WINDOWS-1251]
    ]
  ]

  ^pfAssert:isTrue($oLocales.count == 2)[Неверное количество локалей по умолчанию.]

  ^oLocales.foreach[oLocale]{
    ^pfAssert:isTrue($oLocale is conceptLocaleItem)[Объект локали [index: $oLocales.currentIndex] не является наследником conceptLocaleItem.]

    ^pfAssert:isTrue($hDefLocales.[$oLocale.ID].Language eq $oLocale.Language)[Language объекта id: $oLocale.ID не соответствует.]
    ^pfAssert:isTrue($hDefLocales.[$oLocale.ID].Abbr eq $oLocale.Abbr)[Abbr объекта id: $oLocale.ID не соответствует.]
    ^pfAssert:isTrue($hDefLocales.[$oLocale.ID].Charset eq $oLocale.Charset)[Charset объекта id: $oLocale.ID не соответствует.]

    ^pfAssert:isTrue($oLocale.STORAGE is conceptStorage)[STORAGE у объекта id: $oLocale.ID не является наследником conceptStorage.]
  }

  $oDefaultLocale[$STORAGE.defaultLocale]

  ^pfAssert:isTrue($oDefaultLocale.ID == 1)[Локаль по умолчанию (id: $oDefaultLocale.ID) не ${hDefLocales.[1].Language}.]

@defaultStorageObjectsTypesTest[]
  $oTypes[^STORAGE.getObjectsTypes[]]

  ^pfAssert:isTrue($oTypes is pfList)[Результат не является наследником pfList.]

  $hDefTypes[
    $.1[
      $.Name[container]
      $.IsFake(false)
    ]
    $.2[
      $.Name[global]
      $.IsFake(true)
    ]
  ]

  ^pfAssert:isTrue($oTypes.count == 2)[Неверное количество типов по умолчанию.]

  ^oTypes.foreach[oType]{
    ^pfAssert:isTrue($oType is conceptObjectTypeItem)[Объект типа [index: $oTypes.currentIndex] не является наследником conceptObjectTypeItem.]

    ^pfAssert:isTrue($hDefTypes.[$oType.ID].Name eq $oType.Name)[Name объекта id: $oType.ID не соответствует.]
    ^pfAssert:isTrue($hDefTypes.[$oType.ID].IsFake == $oType.IsFake)[IsFake объекта id: $oType.ID не соответствует.]
  }

# получение типа по ID
  $oContainer[^STORAGE.getObjectTypeByID[1]]

  ^pfAssert:isTrue($oContainer is conceptObjectTypeItem)[Объект container не является наследником conceptObjectTypeItem.]

  ^pfAssert:isTrue($oContainer.ID == 1 &&
      $oContainer.Name eq $hDefTypes.[1].Name &&
      $oContainer.IsFake == $hDefTypes.[1].IsFake)[Данные container типа не верны.]

# получение типа по имени
  $oGlobal[^STORAGE.getObjectTypeByName[global]]

  ^pfAssert:isTrue($oGlobal is conceptObjectTypeItem)[Объект global не является наследником conceptObjectTypeItem.]

  ^pfAssert:isTrue($oGlobal.ID == 2 &&
      $oGlobal.Name eq $hDefTypes.[2].Name &&
      $oGlobal.IsFake == $hDefTypes.[2].IsFake)[Данные global типа не верны.]

@defaultStorageObjectsTest[]
  $oObjects[^STORAGE.getRootObjects[]]

  ^pfAssert:isTrue($oObjects is pfList)[Результат не является наследником pfList.]

  ^pfAssert:isTrue($oObjects.count == 0)[Неверное количество корневых объектов по умолчанию.]

@createObjectsTest[]
  $sNameRU[Новый корневой объект]
  $sNameUS[New root object]

  $oType[^STORAGE.getObjectTypeByName[container]]

  $oObject[^STORAGE.createObject[$oType;
    $.Name[$sNameRU]
  ][ru_RU]]

  ^pfAssert:isTrue($oObject.ID == 0)[ID у нового объекта не равно 0.]

  ^pfAssert:isTrue($oObject.TypeID == $oType.ID)[ID типа не верно.]
  ^pfAssert:isTrue($oObject.type is conceptObjectTypeItem && $oObject.type.ID == $oType.ID)[Тип объекта не соответствует.]

  ^pfAssert:isTrue($oObject.childrenCount == 0)[Неправильно значение количества потомков для нового объекта.]

  ^pfAssert:isFalse(^oObject.hasParent[])[Созданный корневой объект имеет родителя.]

  ^oObject.setData[
    $.Name[$sNameUS]
  ]

  ^pfAssert:isTrue($oObject.ru_RU.Name eq $sNameRU)[Данные для локали ru_RU не установились.]
  ^pfAssert:isTrue($oObject.en_US.Name eq $sNameUS)[Данные для локали en_US не установились.]

# checking isExist flags
  ^pfAssert:isFalse(^oObject.isExist[])["isExist" flag is enabled for non-exist object.]
  ^pfAssert:isFalse(^oObject.ru_RU.isExist[])["isExist" flag is enabled for "ru_RU" text.]
  ^pfAssert:isFalse(^oObject.en_US.isExist[])["isExist" flag is enabled for "en_US" text.]

# сохраняем объект (в БД)
  ^pfAssert:isTrue(^oObject.save[])[Can not save object.]

# checking id
  ^pfAssert:isTrue($oObject.ID != 0)[Объект не получил ID после сохранения.]

  ^pfAssert:isTrue($oObject.ru_RU.Name eq $sNameRU)[Название для локали ru_RU не соответствует после сохранения объекта.]
  ^pfAssert:isTrue($oObject.en_US.Name eq $sNameUS)[Название для локали en_US не соответствует после сохранения объекта.]

# checking isExist flags
  ^pfAssert:isTrue(^oObject.isExist[])["isExist" flag is disabled for exist object.]
  ^pfAssert:isTrue(^oObject.ru_RU.isExist[])["isExist" flag is disabled for "en_US" text.]
  ^pfAssert:isTrue(^oObject.en_US.isExist[])["isExist" flag is disabled for "en_US" text.]

# удаляем объект (из БД)
  ^pfAssert:isTrue(^oObject.remove[])[Can not remove object.]

@existObjectsTest[]
  $sNameRU[Локализованное имя]

  $sChildNameRU[Ребенок 1]

  $oType[^STORAGE.getObjectTypeByName[container]]

  $oObject[^STORAGE.createObject[container;New object]]
  ^oObject.localizedData.publish[]

  $oChild[^oObject.createChild[container;$sChildNameRU;ru_RU]]
  ^oChild.ru_RU.publish[]

  ^pfAssert:isTrue(^oChild.save[])[Can not save temporary object.]

  $iID[$oObject.ID]

  $iChildID[$oChild.ID]

# re-init module
  ^initModule[]

  ^STORAGE.setRelease(false)

  $oObject[^STORAGE.getObjectByID[$iID]]

  ^pfAssert:isTrue($oObject.ID != 0)[ID is wrong.]

  $oChild[^oObject.getChildByName[$sChildNameRU;ru_RU]]

  ^pfAssert:isTrue(def $oChild)[Не удалось получить ребенка по имени.]

  ^oObject.setData[$sNameRU;ru_RU]

  ^pfAssert:isFalse(^oObject.ru_RU.isExist[])["isExist" flag is enabled for "ru_RU" text.]

  ^pfAssert:isTrue(^oObject.save[])[Can not save loaded object.]

  ^pfAssert:isTrue(^oObject.ru_RU.isExist[])["isExist flag is disabled for "ru_RU" text.]

  ^pfAssert:isTrue(^oObject.remove[])[Can not remove object.]

  ^pfAssert:isFalse(^oChild.isExist[])[Ребенок не удалился вместе с родителем.]

  ^pfAssert:isTrue($oObject.ru_RU is conceptObjectTextItem)[Текст объекта потерялся.]

#  BUG "object not found"
#  ^pfAssert:isTrue($oObject.ru_RU.object is conceptObjectItem)[Нет доступа к объекту из текста.]

  ^STORAGE.setRelease(true)

@nonExistObjectsTest[]
  $oRoot[^STORAGE.createObject[container;My New Object]]

  $oChild1[^oRoot.createChild[container;First Child]]
  $oChild2[^oRoot.createChild[container;Second Child]]

  $oSubChild[^oChild2.createChild[container;Sub Child]]

  ^pfAssert:isTrue($oRoot.childrenCount == 2)[Неверное количество потомков после создания потомков.]

  $oChilds[$oRoot.children]

  ^pfAssert:isTrue($oRoot.children)[Нет доступа к потомкам у нового корневого объекта.]

  $oGettedChild1[^oChilds.at(0)]
  $oGettedChild2[^oChilds.at(1)]

  ^pfAssert:isTrue($oChild1.UID eq $oGettedChild1.UID)[Первый ребенок не соотвествует оригиналу.]
  ^pfAssert:isTrue($oChild2.UID eq $oGettedChild2.UID)[Второй ребенок не соотвествует оригиналу.]

  $oGettedSubChild[$oRoot.children.1.children.0]

  ^pfAssert:isTrue($oRoot.children.1.children.count == 1)[Количество "внуков" неверно.]

  ^pfAssert:isTrue($oSubChild.UID eq $oGettedSubChild.UID)["Внук" не соответствует оригиналу.]